package com.yang.imbatis.scan;

import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.core.type.classreading.MetadataReader;

import java.io.IOException;
import java.util.Set;

/**
 * @Description: 自己定义的扫描器, 继承spring的扫描器, 目的就是为了扩展可以扫描接口
 * 					spring执行完自己的扫描器, 就会来执行我们的扫描器
 * @author: Yang Qiang
 * @create: 2021-10-28 21:00
 */
public class YangClassPathBeanDefinitionScanner extends ClassPathBeanDefinitionScanner {
	/**
	 * 父类能够被实例化
	 * 不希望spring的默认扫描器也就是父类调用默认的注册过滤器的方法
	 * @param registry
	 * @param useDefaultFilters
	 */
	public YangClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters) {
		super(registry);
	}

	@Override
	protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException {
		/*
			● 我们在spring自己的扫描器的第5步的时候, 由于我们的接口是不会加任何注解的,
			所以如果我们不做事情的话在这一步我们的接口就被spring给排除了, 所以我们需要重写这个方法, 让我们的接口通过校验,
			所以我们重写这个方法, 让这个方法恒定的返回true
		 */
		return true;
	}

	@Override
	protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
		/*
			● 我们在spring自己的扫描器的第5步的第二个判断的时候, 由于spring自己的会过滤掉接口, 所以我们需要对这个方法进行重写
				- 是接口的话, 我们就返回true
		 */
		return beanDefinition.getMetadata().isInterface();
	}

	@Override
	public Set<BeanDefinitionHolder> doScan(String... basePackages) {
		return super.doScan(basePackages);
	}
}
